#pragma once
#include "al_BasicAbility.h"
#include "al_SingleTargetAbility.h"
//#include "Bucket.h"
//#include "Unit.h"

//To Do //mana cooldown - scope to template // //

/**	-------------------------***
***	How to create an ability ***
***	-------------------------***

class ability1 : public ability_types::abiltype<?>
public:
	constructor(arguments...):ability_types::abiltype<?>(arguments...){}
	void action()
	{ 
		//do stuff here//
		//To get child of the owner base class use - static_cast<Type*>((*this).getOwner())		
	}

/**	-------------------------***
***	More Examples			 ***
***	-------------------------***

class Ability_FillBucket : public ability_types::SingleTargetAbility<Bucket>
{
	public:
	Ability_FillBucket(ability::IAbilityOwner * ownerPtr):SingleTargetAbility<Bucket>("FillBucket",ownerPtr,0,0,0){}
	
	void action()
	{
		getSelectedTarget()->fillBucket();
	}
};

class Ability_HurtUnit : public ability_types::SingleTargetAbility<Unit>
{
public:
	Ability_HurtUnit(std::string name,Unit * ownerPtr, int amount, int mpCost,int cooldown):SingleTargetAbility<Unit>(name,ownerPtr,amount,mpCost,cooldown){}
	
	void action()
	{
		getSelectedTarget()->damageUnit(getAmount(),static_cast<Unit*>((*this).getOwner()));
	}
};

class Ability_SelfHeal : public ability_types::BasicAbility
{
public:
	Ability_SelfHeal(std::string name,Unit * ownerPtr, int amount, int mpCost,int cooldown):BasicAbility(name,ownerPtr,amount,mpCost,cooldown){}

	bool condition(){return true;}

	void action()
	{
		Unit * owner = static_cast<Unit*>((*this).getOwner());
		owner->getCurrentStats()->addHp(getAmount(),owner->getDefaultStats()->getHp());	//adds amount of hp, doesnt go over default amount;
	}
};

**/